package ynu.edu.service;

import com.baomidou.mybatisplus.extension.service.IService;
import ynu.edu.domain.PageDTO;
import ynu.edu.domain.dto.Img2ImgRequest;
import ynu.edu.domain.vo.Img2ImgResponse;
import ynu.edu.entity.Img2Img;

import java.util.List;
import java.util.Map;

/**
 * Img2Img服务接口
 */
public interface Img2ImgService extends IService<Img2Img> {

    /**
     * 执行Img2Img图片生成
     * @param request Img2Img请求参数
     * @return 生成结果
     */
    Img2ImgResponse img2img(Img2ImgRequest request);

    /**
     * 使用动漫风格转换图片
     * @param request Img2Img请求参数
     * @return 生成结果
     */
    Img2ImgResponse animeStyleTransform(Img2ImgRequest request);
    
    /**
     * 使用宫崎骏风格转换图片
     * @param request Img2Img请求参数
     * @return 生成结果
     */
    Img2ImgResponse ghibliStyleTransform(Img2ImgRequest request);
    
    /**
     * 检查Flask API服务健康状态
     * @return 服务健康状态信息
     */
    Map<String, Object> checkServiceHealth();

    /**
     * 根据任务ID查询生成记录
     * @param taskId 任务ID
     * @return 生成记录
     */
    Img2Img getByTaskId(String taskId);

    /**
     * 根据状态查询生成记录列表
     * @param status 状态
     * @return 记录列表
     */
    List<Img2Img> getByStatus(String status);

    /**
     * 根据模型名称查询生成记录列表
     * @param modelName 模型名称
     * @return 记录列表
     */
    List<Img2Img> getByModelName(String modelName);

    /**
     * 分页查询生成记录
     * @param page 页码
     * @param size 每页大小
     * @return 分页结果
     */
    PageDTO<Img2Img> getPage(int page, int size);

    /**
     * 统计生成记录数量
     * @return 记录数量
     */
    long countRecords();

    /**
     * 统计成功生成记录数量
     * @return 成功记录数量
     */
    long countSuccessRecords();

    /**
     * 统计失败生成记录数量
     * @return 失败记录数量
     */
    long countFailedRecords();

    /**
     * 获取统计信息
     * @return 统计信息
     */
    Map<String, Object> getStats();

    /**
     * 调用ControlNet预处理器对图片进行预处理。
     *
     * @param module 预处理器模块名称 (e.g., "canny", "openpose_full")
     * @param inputImage 输入图片的Base64编码
     * @param processorRes 处理器分辨率
     * @param thresholdA 阈值A
     * @param thresholdB 阈值B
     * @return 预处理后的图片Base64编码，如果失败则返回null
     */
    String preprocessImage(String module, String inputImage, Integer processorRes,
                           java.math.BigDecimal thresholdA, java.math.BigDecimal thresholdB);
} 